/**
 * 扑克牌顺子
 *
 * 描述
 * 现在有2副扑克牌，从扑克牌中随机五张扑克牌，我们需要来判断一下是不是顺子。
 * 有如下规则：
 * 1. A为1，J为11，Q为12，K为13，A不能视为14
 * 2. 大、小王为 0，0可以看作任意牌
 * 3. 如果给出的五张牌能组成顺子（即这五张牌是连续的）就输出true，否则就输出false。
 * 4.数据保证每组5个数字，每组最多含有4个零，数组的数取值为 [0, 13]
 *
 * 要求：
 * 空间复杂度
 * O(1)，
 * 时间复杂度
 * O(nlogn)，
 * 本题也有时间复杂度
 * O(n) 的解法
 *
 * 输入描述：
 * 输入五张扑克牌的值
 *
 * 返回值描述：
 * 五张扑克牌能否组成顺子。
 */

/**
 * 这里我们只要保证前面除了 0 没有重复的, 然后 numbers
 * 中的最大值和最小值之间在 5 个数范围之内就可以了
 * 因为不会有重复的, 然后差又在 5 之间, 要么没有 0, 要么 0 可以
 * 补齐之间没有的数
 * 时间复杂度 : O(n)
 * 空间复杂度 : O(1)
 */

public class Main {

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     *
     * @param numbers int整型一维数组
     * @return bool布尔型
     */
    public boolean IsContinuous (int[] numbers) {

        // 用来判断有没有重复的数
        boolean[] hash = new boolean[14];

        // 记录最大值和最小值
        int maxVal = 0, minVal = 14;

        for(int x : numbers) {

            // 首先要不是 0
            if(x != 0) {

                // 重复返回 false
                if(hash[x]) return false;

                // 没有重复, 更新这个数的状态
                hash[x] = true;

                // 取最大和最小数
                maxVal = Math.max(maxVal, x);
                minVal = Math.min(minVal, x);
            }
        }

        // 这里只要之间差 为 5 就可以了
        return maxVal - minVal + 1 <= 5;
    }
}